<?php
class jobcats {
  function __construct() {
  }

  public function listjct() {
	$errcode = 0;
	$errmess = '';
    $data = array();
	
    try
    {
// Только зарегистрированные пользователи могут видеть данные
		if( !isset($_SESSION['user_id']) || $_SESSION['user_id'] == 0 )
			throw new Exception(ERR_M::TIMEOUT_ERROR, 999);

// Если есть разрешение видеть хоть, что-нибуть, то маска должна быть READ_ANY
		$rwd = $_SESSION['priv']->jobcats->rwd;
		if( ( $rwd & PERM_BITS::READ_ANY ) == 0 ) throw new Exception(ERR_M::DATA_OPER_DISABLED, 99);

// Открываем базу данных
		$db = App::me()->dbOpen();	

// Фильтр привилегий
		if( $rwd & PERM_BITS::READ_OTH ) $whs = '1 = 1';
		elseif( $rwd & PERM_BITS::READ_GRP ) 
			$whs = 'jct_user_id IN (SELECT user_id FROM users WHERE cat_id = '.$_SESSION['cat_id'].')';
		elseif( $rwd & PERM_BITS::READ_OWN ) $whs = 'jct_user_id = '.$_SESSION['user_id'];
		else $whs = '1 = 0';
		
// Формируем запрос
		$sql =	'SELECT * FROM jobcats WHERE '.$whs.' ORDER BY jct_order';
		$rs = $db->query($sql);                  
        while( $row = $rs->fetchObject() ) {
            $unit = new stdClass;
            $unit->key = $row->jct_id;
			$unit->title = $row->jct_name;
			$unit->order = $row->jct_order;
            $unit->isFolder = false;
            $unit->isLazy = false;
            $data[] = $unit;
        }
        $rs->closeCursor();
 
    }
	catch (PDOException $e) {
		$errcode = 1;
		$errmess = ERR_M::DATABASE_ERROR;
	}
    catch ( Exception $e ) {
		$errcode = $e->getCode();
		$errmess = $e->getMessage();
	}

	if( $errcode ) {
		$unit = new stdClass;
		$unit->title = '';
		$unit->errcode = $errcode;
		$unit->errmess = $errmess;
		return array($unit);
	}
	else return $data;
  }
  
  public function insjct() {

    $jct_order	= isset($_POST['jct_order']) ? trim(strip_tags($_POST['jct_order'])) : '';
    $jct_descr	= isset($_POST['jct_descr']) ? trim(strip_tags($_POST['jct_descr'])) : '';
	
	$errcode = 0;
	$errmess = '';
	$data = new stdClass;
	
    try
    {
// Только зарегистрированные пользователи могут вносить данные
		if( !isset($_SESSION['user_id']) || $_SESSION['user_id'] == 0 )
			throw new Exception(ERR_M::TIMEOUT_ERROR, 999);
		$jct_user_id = $_SESSION['user_id'];
		
//Есть ли разрешение на вставку записей
		$rwd = $_SESSION['priv']->jobcats->rwd;
		if( ($rwd & PERM_BITS::WRITE_OWN) == 0 ) throw new Exception(ERR_M::DATA_OPER_DISABLED, 99);

// Все ли данные переданы
		$errdata = "";
		
// jct_order
		if( !$jct_order || !ctype_digit($jct_order) )
			$errdata .= ($errdata?'<br>':'')."- Порядковый номер категории указан неверно.";
		
// jct_descr
		if( $jct_descr == '' ) $errdata .= ($errdata?'<br>':'')."- Не задано описание категории.";
		else $jct_descr = mb_substr( $jct_descr, 0, 64, 'UTF-8');

//				
// Если есть ошибки - можно уже закончить
//
		if( $errdata ) throw new Exception($errdata, 1);
		
// Открываем базу данных
		$db = App::me()->dbOpen();
		
// Пишем данные
		try { 
			$db->beginTransaction();
			$sql =	'INSERT INTO jobcats ( jct_order, jct_name, jct_user_id ) '.
					'VALUES ('. $db->quote($jct_order).", ".$db->quote($jct_descr).", ".
							$db->quote($jct_user_id). ")";
			$db->exec($sql);
			$jct_id = $db->lastInsertId();
			
			$db->commit();
		} 
		catch(PDOExecption $e) { 
			$db->rollback(); 
			$errcode = 1;
			$errmess = ERR_M::DATABASE_ERROR;
		} 
												
		$data->key = $jct_id;
		$data->order = $jct_order;
		$data->title = $jct_descr;
    }
	catch (PDOException $e) {
		$errcode = 1;
		$errmess = ERR_M::DATABASE_ERROR;
	}
    catch ( Exception $e ) {
		$errcode = $e->getCode();
		$errmess = $e->getMessage();
	}

	return array('errcode'=>$errcode,'errmess'=>$errmess, 'data'=>$data);
  }

  
  public function updjct() {

    $jct_id		= isset($_POST['jct_id']) ? trim(strip_tags($_POST['jct_id'])) : '';
    $jct_order	= isset($_POST['jct_order']) ? trim(strip_tags($_POST['jct_order'])) : '';
    $jct_descr	= isset($_POST['jct_descr']) ? trim(strip_tags($_POST['jct_descr'])) : '';
	
	$errcode = 0;
	$errmess = '';
	$data = new stdClass;
	
    try
    {
// Только зарегистрированные пользователи могут вносить данные
		if( !isset($_SESSION['user_id']) || $_SESSION['user_id'] == 0 )
			throw new Exception(ERR_M::TIMEOUT_ERROR, 999);
		$jct_user_id = $_SESSION['user_id'];
		
//Есть ли разрешение на вставку записей
		$rwd = $_SESSION['priv']->jobcats->rwd;
		if( ($rwd & PERM_BITS::WRITE_ANY) == 0 ) throw new Exception(ERR_M::DATA_OPER_DISABLED, 99);

// Все ли данные переданы
		$errdata = "";
		
// jct_id
        if (!$jct_id || !ctype_digit( $jct_id ))
			throw new Exception(ERR_M::PROTOCOL_ERROR, 1);
        
// jct_order
		if( !$jct_order || !ctype_digit($jct_order) )
			$errdata .= ($errdata?'<br>':'')."- Порядковый номер категории указан неверно.";
		
// jct_descr
		if( $jct_descr == '' ) $errdata .= ($errdata?'<br>':'')."- Не задано описание категории.";
		else $jct_descr = mb_substr( $jct_descr, 0, 64, 'UTF-8');

//				
// Если есть ошибки - можно уже закончить
//
		if( $errdata ) throw new Exception($errdata, 1);
		
// Открываем базу данных
		$db = App::me()->dbOpen();
		
// Есть ли разрешение на апдейт этой записи
		if( $rwd & PERM_BITS::WRITE_OTH ) $where = '1 = 1';
		elseif( $rwd & PERM_BITS::WRITE_GRP ) 
			$where = 'jct_user_id IN (SELECT user_id FROM users WHERE cat_id = '.$_SESSION['cat_id'].')';
		elseif( $rwd & PERM_BITS::WRITE_OWN ) $where = 'jct_user_id = '.$_SESSION['user_id'];
		else $where = '1 = 0';
		$where .= ' AND jct_id = '.$db->quote($jct_id);
		
		$sqlreq = 'SELECT COUNT(*) AS count FROM jobcats WHERE '.$where.' LIMIT 1';
		$rs = $db->query( $sqlreq );		
		$row = $rs->fetch(PDO::FETCH_ASSOC);
		if( !$row['count'] ) {
			throw new Exception(ERR_M::DATA_OWNER_DISABLED, 99);
        }    
		$rs->closeCursor();
		
// Пишем данные
        $sqlreq =   'UPDATE jobcats SET '.
						'jct_order = '.$db->quote($jct_order).", ".
						'jct_name = '.$db->quote($jct_descr)." ".
					'WHERE jct_id = '.$db->quote($jct_id);
		$db->exec($sqlreq);

		$data->key = $jct_id;
		$data->order = $jct_order;
		$data->title = $jct_descr;
    }
	catch (PDOException $e) {
		$errcode = 1;
		$errmess = ERR_M::DATABASE_ERROR;
	}
    catch ( Exception $e ) {
		$errcode = $e->getCode();
		$errmess = $e->getMessage();
	}

	return array('errcode'=>$errcode,'errmess'=>$errmess, 'data'=>$data);
  }

  
  public function deljct() {
    $errmess = "";
	$errcode = 0;
		
    $jct_id = isset($_POST['jct_id']) ? trim(strip_tags($_POST['jct_id'])) : '';

    try
    {
// Только зарегистрированные пользователи могут удалять данные
		if( !isset($_SESSION['user_id']) || $_SESSION['user_id'] == 0 )
			throw new Exception(ERR_M::TIMEOUT_ERROR, 999);

        if (!$jct_id || !ctype_digit( $jct_id ))
			throw new Exception(ERR_M::PROTOCOL_ERROR, 1);
        
// Есть ли разрешение на удаление хоть каких либо записей jobcats
		$rwd_jct = $_SESSION['priv']->jobcats->rwd;
		if( ($rwd_jct & PERM_BITS::DELETE_ANY) == 0 ) throw new Exception(ERR_M::DATA_OPER_DISABLED, 99);
		
// Открываем базу данных
		$db = App::me()->dbOpen();	

// Проверяем задействована ли эта запись в других таблицах
		if( ( $errdata = $this->is_jct_used_anyware( $db, $jct_id )) != '' )
			throw new Exception( "Удаляемая запись задействована в следующих справочниках:<br>".$errdata, 1);

// Есть ли разрешение на удаление записей jobcats
		if( $rwd_jct & PERM_BITS::DELETE_OTH ) $where = '1 = 1';
		elseif( $rwd_jct & PERM_BITS::DELETE_GRP ) 
			$where = 'jct_user_id IN (SELECT user_id FROM users WHERE cat_id = '.$_SESSION['cat_id'].')';
		elseif( $rwd_jct & PERM_BITS::DELETE_OWN ) $where = 'jct_user_id = '.$_SESSION['user_id'];
		else $where = '1 = 0';
		$where .= ' AND jct_id = '.$db->quote($jct_id);
		
		$sqlreq = 'SELECT COUNT(*) AS count FROM jobcats WHERE '.$where;
		$rs = $db->query( $sqlreq );		
		$row = $rs->fetch(PDO::FETCH_ASSOC);
		if( $row['count'] == 0 ) {
			throw new Exception(ERR_M::DATA_OWNER_DISABLED, 99);
        }    
		$rs->closeCursor();
		
// Удаляем записи из справочника
		$sql =	'DELETE FROM jobcats WHERE jct_id = '.$db->quote($jct_id);
		$db->exec($sql);
	}
	catch (PDOException $e) {
		$errcode = 1;
		$errmess = ERR_M::DATABASE_ERROR;
	}
    catch ( Exception $e ) {
		$errcode = $e->getCode();
		$errmess = $e->getMessage();
	}

	return array('errcode'=>$errcode,'errmess'=>$errmess);
  }

  
  private function is_jct_used_anyware( $db, $jct_id ) {
	$sql =  "SELECT 'Виды работ и платежей' as a FROM `jobtypes` WHERE jtp_cat_id = ".$db->quote($jct_id)." LIMIT 1";
	$errdata = '';
	$rs = $db->query($sql);
	while( $row = $rs->fetchObject() ) $errdata .= ($errdata?', ':'')."'".$row->a."'";
	$rs->closeCursor();	
	return $errdata;
  }
  
} // End Of jobcats class 
?>